//
//  TTTDownloaderController.m
//  ProjectDemo
//
//  Created by IOS3 on 2019/1/25.
//  Copyright © 2019 IOS3. All rights reserved.
//

#import "TTTDownloaderController.h"

@interface TTTDownloaderController () <NSURLSessionDownloadDelegate>
@property (weak, nonatomic) IBOutlet UILabel *infoLabel;
@property (weak, nonatomic) IBOutlet UIButton *button;


@property (nonatomic, strong) NSURLSession *session;
@property (nonatomic, strong) NSURLSessionDownloadTask *task;
@property (nonatomic, strong) NSData *resumeData;
@end

@implementation TTTDownloaderController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSURL *url = [NSURL URLWithString:@"http://tb-video.bdstatic.com/tieba-smallvideo-transcode/3244078_e1aedc1ba2e1d1228e6b0bcb72cbdffc_0.mp4"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    self.task = [self.session downloadTaskWithRequest:request];
    
    [self.task resume];
}


- (NSURLSession *)session {
    if (!_session) {
        NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
        /**
         代理的工作队列
         
         nil - 异步回调 和 实例化一个 操作队列的效果是一样的！
         [[NSOperationQueue alloc] init] － 异步回调
         － 注意：下载本身的线程"只有一条"
         － 代理回调可以在"多个线程"回调！
         
         [NSOperationQueue mainQueue] - 主队列回调
         提示：
         - 下载本身就是异步执行的，和 NSURLConnection 是一样的
         - 指定代理执行的队列，不会影响到下载本身的执行
         - NSURLSession 即使在主线程回调也不会造成阻塞
         
         如何选择队列？
         - 如果执行完毕后，没有复杂的操作，可以指定主队列，可以不用考虑线程间通讯！
         */
        _session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
    }
    return _session;
}


- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location {
    NSLog(@"!!!%@ %@", location, [NSThread currentThread]);
    
}
// 续传的方法，iOS 7.0 必须实现，在 iOS 8.0 可选
- (void)URLSession:(NSURLSession *)session   downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes {
    
    NSLog(@"%s", __FUNCTION__);
    
}

// 进度的方法，iOS 7.0 必须实现，在 iOS 8.0 可选
/**
 bytesWritten               本次下载字节数
 totalBytesWritten          已经下载字节数
 totalBytesExpectedToWrite  总下载字节数
 */
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {
    
    float progress = (float) totalBytesWritten / totalBytesExpectedToWrite;
    NSLog(@"%f %@", progress, [NSThread currentThread]);
    
    dispatch_async(dispatch_get_main_queue(), ^{
        
    });
    
}

@end
